#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

int n;
vector<int> G[500005]; // 邻接表存图

vector<pii> A[500005]; // A[i] 表示 i 到 每个子结点的 子树内部某一结点的最远距离
                       // 及其编号
pii ret[500005];       // ret[i] 表示 dfs1 中 i 向父结点 return 的结果

pii ans[500005]; // first 表示到其它点的距离最大值，second 表示点的编号

// 返回 u 的子树内部 距离 u 最远的结点 与 u 之间的距离 及其编号
// first 表示距离，second 表示编号
pii dfs1(int u, int father) {
  for (int &v : G[u]) {
    if (v == father)
      continue;
    pii res = dfs1(v, u);
    res.first++; // 往上传递一层 最远距离+1
    A[u].push_back(res);
  }
  A[u].push_back(pii(0, u));
  // 多放一个我到我自己的贡献，免去对叶子结点以及空数组的判断
  sort(A[u].begin(), A[u].end());
  return ret[u] = A[u].back(); // 返回 距离最大值及此时的结点编号
}

// first 表示距离，second 表示编号
// 判断两个答案，取距离较大者，距离相同取编号较大者
pii checkMax(pii a, pii b) {
  if (a.first > b.first || a.first == b.first && a.second > b.second)
    return a;
  return b;
}

// 换根 dp，假设 u 为根
// ansf 表示不在 u 的子树内部的点到 u 的最远距离 及其编号
// first 表示距离，second 表示编号
void dfs2(int u, int father, pii ansf) {
  ans[u] = checkMax(ansf, A[u].back());

  for (int &v : G[u]) {
    if (v == father)
      continue;

    if (ret[v].second == ans[u].second)
    // v 方向是当前 ans[u] 的答案来源，不能直接传 ans[u]
    {
      // 要取 A[u] 的次大答案与 ansf 的较大值 作为新的 ansf 传递下去
      pii nxtf;
      nxtf = checkMax(ansf, A[u][A[u].size() - 2]);
      nxtf.first++; // 往下传递一层 最远距离+1
      dfs2(v, u, nxtf);
    } else {
      pii nxtf = ans[u];
      nxtf.first++; // 往下传递一层 最远距离+1
      dfs2(v, u, nxtf);
    }
  }
}

void solve() {
  cin >> n;
  for (int i = 1; i < n; i++) {
    int a, b;
    cin >> a >> b;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  dfs1(1, 0);
  dfs2(1, 0, pii(-1, 0));
  for (int i = 1; i <= n; i++)
    cout << ans[i].second << "\n";
}